package arr


type StreamRank struct {
	Arr  []int
	Size int
}

func Constructor() StreamRank {
	return StreamRank{
		Arr:  make([]int, 50005),
		Size: 50005,
	}
}

func (this *StreamRank) Track(x int) {
	// this.Arr[x]保存的是x对应分组区间中小于等于x的数的个数
	// 添加x之后，对于在x之后的元素y来说，x肯定是小于y的，所以需要从低层到高层逐层修改this.Arr[y]，数量+1即可(增加了一个小于等于自己的数)
	// 这里需要注意：由于本题没有给出x的最小值，所以默认是0，由于0进行pos += (pos)&(-pos)的操作始终为0(无法向上层进行修改)，所以需要将x转换为x+1处理
	for pos := x + 1; pos < this.Size; pos += (pos) & (-pos) {
		this.Arr[pos]++
	}
}

func (this *StreamRank) GetRankOfNumber(x int) int {
	var ans int
	for pos := x + 1; pos > 0; pos -= (pos) & (-pos) {
		ans += this.Arr[pos]
	}
	return ans
}

/**
 * Your StreamRank object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Track(x);
 * param_2 := obj.GetRankOfNumber(x);
 */
